package com.xyebank.cn.project.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.io.*;
import java.nio.charset.Charset;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * 压缩工具类
 */
@Component
public class ZipUtil {
    private final Logger logger=LoggerFactory.getLogger(this.getClass());
    public void dozip(String srcfile, String zipfile) throws IOException {
        String temp = "";
        File src = new File(srcfile);
        File zipFile=new File(zipfile);
        //判断要压缩的文件存不存在
        if (!src.exists()) {
            logger.error("要压缩的文件不存在！");
            System.exit(1);
        }
        //如果说压缩路径不存在，则创建
        if (!zipFile.getParentFile().exists()) {
            zipFile.getParentFile().mkdirs();
    //   System.out.println("创建ok");
        }
        // 封装压缩的路径
        BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(zipfile));
        //这里可以加入校验
        //CheckedOutputStream cos = new CheckedOutputStream(bos,new CRC32());
        //还可以设置压缩格式，默认UTF-8
        Charset charset = Charset.forName("UTF-8");
        ZipOutputStream zos = new ZipOutputStream(bos,charset);
        zip(src, zos, temp);
        //关闭流
        zos.flush();
        zos.close();
        logger.info("压缩完成！");
        logger.info("压缩文件的位置是：" + zipfile);
    // System.out.println("检验和："+cos.getChecksum().getValue());
    }

    private void zip(File file, ZipOutputStream zos, String temp)
            throws IOException {
        // 如果不加"/"将会作为文件处理，空文件夹不需要读写操作
        if (file.isDirectory()) {
            String str = temp + file.getName() + "/";
            zos.putNextEntry(new ZipEntry(str));
            File[] files = file.listFiles();
            for (File file2 : files) {
                zip(file2, zos, str);
            }
        } else {
            logger.info("当前文件的父路径:"+temp);
            ZipFile(file, zos, temp);
        }
    }

    private void ZipFile(File srcfile, ZipOutputStream zos, String temp)
            throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
                srcfile));
        zos.putNextEntry(new ZipEntry(temp + srcfile.getName()));
        byte buf[] = new byte[1024];
        int len;
        while ((len = bis.read(buf)) != -1) {
            zos.write(buf, 0, len);
        }
        zos.closeEntry();
        bis.close();
    }
}
